/**
 * Baco OPC - Baco Sistemas corp.
 */

package bacoopc.algoritmos_de_controle;

import bacoopc.AlgoritmoDeControle;

/**
 *
 * @author Baco Sistemas
 */
public class PID extends AlgoritmoDeControle {

    private double erroAtual = 0.0;

    public PID() {
        this.getTodosParâmetros().put(REFERÊNCIA, 0.0);
        this.getTodosParâmetros().put(KP,        0.0);
        this.getTodosParâmetros().put(KI,        0.0);
        this.getTodosParâmetros().put(KD,        0.0);
    }

    @Override
    public double f(double valor) {
        double ref = this.getParâmetro(REFERÊNCIA);
        double Kp  = this.getParâmetro(KP);
        double Ki  = this.getParâmetro(KI);
        double Kd  = this.getParâmetro(KD);

        double e = ref - valor;

        double P = Kp * e;
        double I = erroAtual + Ki * e;
        double D = Kd * (erroAtual - e) / getT();

        erroAtual = e;

        return P + I + D;
    }

    private static final String REFERÊNCIA   = "Valor de referência";
    private static final String KP          = "Kp";
    private static final String KI          = "Ki";
    private static final String KD          = "Kd";

    @Override
    public String getName() {
        return "PID";
    }

}
